#ifndef JOUEUR_PRIVATE_H_
#define JOUEUR_PRIVATE_H_

#include "Joueur.h"

/**
 * \struct _Joueur
 * \brief Définie la structure interne d'un joueur
 */
struct _Joueur{
	int numero;					/*< Numero du joueur (ex: 1, 2, 3...) */
	char* nom;					/*< Nom du joueur */
	List* persos;				/*< Personnage appartenant à ce joueur */
	ListIterator* it;			/*< Itérateur pointant sur le personnage actuellement utilisé par ce joueur */
	Personnage* lastPerso;		/*< Pointeur sur le dernier personange choisit par ce joueur */
	
	/***************************
	 * Héritage
	 */
	TypeJoueur type; 			/*< Type de la classe qui hérite de celle-ci */
	void* ext; 					/*< Données étendues propre à la classe qui hérite celle-ci */
	/* virtual methods  */
	int (* askFairePause)(Joueur* joueur);
	int (* askUsePouvoir)(Joueur* joueur,Pouvoir* pouvoir);
	Personnage* (* askChooseEnnemi)(Joueur* joueur,List* p);
	Personnage* (* askNextPersonnage)(Joueur* joueur);
	void (* free)(Personnage* perso);
};

/* Settlers */
void joueurSetIt(Joueur* joueur, ListIterator* it);
void joueurSetPersos(Joueur* joueur,List* persos);
void joueurSetNumero(Joueur* joueur,int num);
void joueurSetNom(Joueur* joueur,char* nom);
void joueurSetLastPerso(Joueur* joueur,Personnage* perso);

/* Getters */
Personnage * joueurGetLastPerso(Joueur* joueur);

/* Méthodes */
/**
 * \fn int joueurGetNextNumero()
 * \brief retourne le prochain numero de joueur disponible
 * à chaque appel de cette fonction un nouveau numéro de joueur est retourné
 * 
 * \note cettte fonction est thread safe
 * 
 * \return Un nouveau numéro de joueur
 */
int joueurGetNextNumero();

#endif /*JOUEUR_PRIVATE_H_*/
